int MinDist (ImSize, MaxDist, MaxCen, Ch0, Ch1, Ch2, ClasIm)
int ImSize, MaxDist, MaxCen;
BYTE ** Ch0;
BYTE ** Ch1;
BYTE ** Ch2;
BYTE ** ClasIm;
{
   int    r,c, i, NofCen, FitCent;
   int    *Cent0, far *Cent1, far *Cent2;
   float  Dist, MinDist, D0,D1,D2;

   NofCen = 1;
   for (r=0; r<ImSize; r++)
      for (c=0; c<ImSize; c++)  ClasIm [r][c] = 0;

   Cent0 = malloc (MaxCen * sizeof(int));
   Cent1 = malloc (MaxCen * sizeof(int));
   Cent2 = malloc (MaxCen * sizeof(int));

   Cent0 [0] = Ch0 [0][0];
   Cent1 [0] = Ch1 [0][0];
   Cent2 [0] = Ch2 [0][0];

   for (r=0; r<ImSize; r++) {
      for (c=0; c<ImSize; c++) {
         MinDist = (float)1.0e37;
         FitCent = 0;
         for (i=0; i<NofCen; i++) {
            D0 = (float) Ch0[r][c] - Cent0[i];   D0 *= D0;
            D1 = (float) Ch1[r][c] - Cent1[i];   D1 *= D1;
            D2 = (float) Ch2[r][c] - Cent2[i];   D2 *= D2;

            Dist = (float) sqrt ((double) D0 + D1 + D2);

            if (Dist < MinDist)  {
               MinDist = Dist;
               FitCent = i;
         }  }
         ClasIm [r][c] = (BYTE) FitCent+1;

         if ((int)MinDist > MaxDist) {
            Cent0 [NofCen] = Ch0 [r][c];
            Cent1 [NofCen] = Ch1 [r][c];
            Cent2 [NofCen] = Ch2 [r][c];
            NofCen++;
            if (NofCen >= MaxCen) {
               NofCen = -1;
               goto Leave;
            }
            ClasIm [r][c] = (BYTE) NofCen;
   }  }  }

Leave:
   return (NofCen);
}
